package 数据结构.链表.双链表;



public class DoubleLinkedList {
    private HeroNode head = new HeroNode(0,"","");
    public HeroNode getHead(){
        return head;
    }

    //    遍历双向链表
    public void list() {
//        先判断是否为空
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
//        因为头节点不能为空，所以需要辅助变量来帮助遍历
        HeroNode temp = head.next;
        while (temp != null) {
//            输出节点信息：打印的时候自动调用tostring（）方法
            System.out.println(temp);
//            记得要接着指向下一个节点,一定要后移
            temp = temp.next;
        }
    }

    //    双向链表的添加
    public void add(HeroNode heroNode) {
//        因为head节点不能动，因此我们需要辅助遍历temp
        HeroNode temp = head;
//        遍历链表，找到最后
        while (temp.next != null) {
            temp = temp.next;
        }
       /* while(true){
            if(temp.next == null)
                break;
            temp = temp.next;
        }*/
//        当while循环结束后，表示temp就指向了最后节点，就把最后的节点指向新的节点,把新的节点的pre指向temp
        temp.next = heroNode;
        heroNode.pre = temp;
    }

    //    修改_双向链表一个节点，和钱买你单项链表几乎一样
    public void update(HeroNode newHeroNode) {
        if (head.next == null) {//第一步，先判断链表是否为空
            System.out.println("链表为空，无法修改");
            return;
        }
        HeroNode temp = head;//设辅助指针
        Boolean flag = false;// 定义 flag 判断是否找到，默认false未找到
        while (temp.next != null) {//当链表的next不为空时，就是还没到最后一个时
            if (temp.next.no == newHeroNode.no) {//如果找到no编号相等的
                flag = true;
                break;//记得要跳出。不然会空指针报错
            }
            temp = temp.next;//没有就继续往后移
        }
        if (flag) {//判断flag
            temp.next.nickname = newHeroNode.nickname;
            temp.next.name = newHeroNode.name;
        } else {
            System.out.println(newHeroNode.no + "此节点在链表中未找到");
        }
    }
//    从双向链表中删除一个节点，变化较大
//    变化之处，对于双向链表不用找打前一个节点，找到要删除的节点后自我删除即可

public void delete(int no){
    HeroNode temp = head.next;//辅助节点
    Boolean flag = false;//标识是否找到
    if (temp.next == null) {
        System.out.println("该链表为空，无法删除");
        return;
    }
    while (temp != null) {//当没有遍历到最后
        if (temp.no == no) {//找到
            flag = true;
            break;
        }
        temp = temp.next;
    }
    if (flag) {//
        temp.pre.next = temp.next;//让temp的前一个节点的next指向temp的下一个节点
        //下面这一句有风险！！，如果是最后一个节点，temp.next.pre会出现空指针异常，所以要加上一个判断
        if (temp.next != null) {
            temp.next.pre = temp.pre;//让temp的后一个节点的pre指向temp的前一个节点
        }
    } else {
        System.out.println("未找到"+no+"该节点，无法删除");
    }
}
}
